package com.example.llh.weather_llh_21;



import org.json.JSONArray;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

/**
 * JSON 天气数据解析工具类：将原始JSON数据转换为结构化对象
 */
public class WeatherParser {
    /**
     * 解析原始JSON字符串生成天气响应对象
     * @param jsonString 来自API的原始JSON字符串
     * @return 结构化的WeatherResponse对象
     * @throws Exception 当JSON格式不匹配或关键字段缺失时抛出异常
     */
    public static WeatherResponse parse(String jsonString) throws Exception {
        JSONObject json = new JSONObject(jsonString);
        WeatherResponse response = new WeatherResponse();

        // 时间解析
        response.time = json.optString("time", "N/A"); // 安全获取时间字段

        response.temperature = json.optInt("temperature",-999);

        // 解析基础响应字段
        response.status = json.getInt("status");     // 响应状态码
        response.message = json.getString("message");// 接口消息
        response.time = json.getString("time");

        // 解析嵌套结构数据
        response.cityInfo = parseCityInfo(json.getJSONObject("cityInfo"));
        response.data = parseWeatherData(json.getJSONObject("data"));

        return response;
    }


    /**
     * 解析城市基础信息
     * @param json 城市信息JSON对象
     * @return 结构化城市信息对象
     */
    private static WeatherResponse.CityInfo parseCityInfo(JSONObject json) throws Exception{
        WeatherResponse.CityInfo info = new WeatherResponse.CityInfo();
        // 容错处理缺失字段
        if (json.has("city")) {
            info.city = json.getString("city");
        } else {
            info.city = "N/A"; // 设置默认值或处理缺失字段
        }
        return info;
    }

    /**
     * 解析天气核心数据
     * @param json 天气数据JSON对象
     * @return 结构化天气数据对象
     */
    private static WeatherResponse.WeatherData parseWeatherData(JSONObject json) throws Exception {
        WeatherResponse.WeatherData data = new WeatherResponse.WeatherData();
//        data.shidu = json.getString("shidu");
//        data.pm25 = json.getDouble("pm25");
        // 使用安全获取方法，避免字段缺失导致崩溃
        data.shidu = json.optString("shidu", "N/A");
        data.pm25 = json.optDouble("pm25", 0.0);
        data.forecast = parseForecast(json.getJSONArray("forecast")); // 预报数据
        return data;
    }

    /**
     * 解析天气预报列表数据
     * @param array 天气预报JSON数组
     * @return 天气预报对象列表
     */
    private static List<WeatherResponse.Forecast> parseForecast(JSONArray array) throws Exception {
        List<WeatherResponse.Forecast> forecasts = new ArrayList<>();
        for (int i = 0; i < array.length(); i++) {
            JSONObject item = array.getJSONObject(i);
            WeatherResponse.Forecast forecast = new WeatherResponse.Forecast();
            // 解析每日预报关键字段
            forecast.ymd = item.getString("ymd");// 预报日期
            forecast.type = item.getString("type"); // 天气类型
            forecast.high = item.getString("high");// 最高温度
            forecast.low = item.getString("low");// 最低温度
            forecasts.add(forecast);
        }
        return forecasts;
    }
}